在 Odoo 中,繼承和覆蓋(Overriding)機制是其模組擴展的重要部分,允許開發人員在不改變核心代碼的情況下自訂現有模組。Odoo 提供三種主要的繼承方式:
假設我們有一個 Odoo 模組 sale
,裡面有一個 sale.order
模型。現在我們希望添加一個新字段,並且覆蓋保存(create
)方法來添加一些自訂邏輯。
首先,我們會在我們的自訂模組中繼承 sale.order
模型並添加一個新字段。
models/inherited_sale_order.py
:
from odoo import models, fields
class InheritedSaleOrder(models.Model):
_inherit = 'sale.order'
# 添加一個新字段
custom_note = fields.Char(string='Custom Note')
我們就成功繼承了 sale.order
模型並添加了 custom_note
字段。
接著,我們覆蓋 create
方法,在每次保存銷售訂單時,自動在 custom_note
字段中添加一段自訂訊息。
from odoo import models, fields
class InheritedSaleOrder(models.Model):
_inherit = 'sale.order'
custom_note = fields.Char(string='Custom Note')
# 覆蓋 create 方法
@api.model
def create(self, vals):
# 在 custom_note 字段中添加一段自訂訊息
vals['custom_note'] = 'This order was created by %s' % self.env.user.name
return super(InheritedSaleOrder, self).create(vals)
在這個例子中,我們先調用了父類的 create
方法,然後在 custom_note
中添加了創建訂單的用戶名稱。
我們還可以繼承 sale.order
的視圖來顯示新字段 custom_note
。這裡我們會修改 sale.order.form
的表單視圖。
views/inherited_sale_order_view.xml
:
<odoo>
<record id="view_order_form_inherited" model="ir.ui.view">
<field name="name">sale.order.form.inherited</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<!-- 在 customer signature 欄位之後插入 custom_note 字段 -->
<xpath expr="//field[@name='client_order_ref']" position="after">
<field name="custom_note"/>
</xpath>
</field>
</record>
</odoo>
這段 XML 代碼會修改 sale.order.form
表單,將 custom_note
字段插入到 "customer signature" 之後。
1️⃣繼承模型:擴展現有模型(如 sale.order
)並添加自訂字段。
2️⃣ 覆蓋方法:使用 Python 裡的 @api.model
裝飾器來覆蓋核心邏輯,對 create
或 write
方法進行修改。
3️⃣ 繼承視圖:使用 Odoo 的 XML 定義文件來修改已有的表單或樹狀視圖,顯示新增的字段或修改介面佈局。